Das optimale ZFS-Dateisystem – Teil 1 Erzeugen eines Pools mit optionaler SSD-Beschleunigung

Dieser Artikel beschreibt, mit welchen man Parametern sich ein ZFS-Dateisystem unter Linux einrichten lässt, um eine sehr gute Performance zu erziehlen.

Einen ZFS-Pool anlegen

ZFS bietet die Möglichkeit, Pools in unterschiedlichen Konfigurationen zu betreiben. Steht nur eine Festplatte zur Verfügung, so gibt es nicht viele Optionen ;-).

Ab zwei Festplatten kann man diese als Spiegel („mirror“,“raidz“) oder als großes ganzes („stripe“) betreiben. Die beste Performance bei gleichzeitig hoher Datensicherheit erreicht man mittels Mirrors. Hier werden die Daten immer auf mindestens zwei Festplatten abgelegt. Bei 4 Festplatten kann man diese paarweise spiegeln und dann als Stripe verbinden. Zwar bietet ZFS mit raidz (ähnlich Raid-5) und raidz2 (ähnlich Raid-6) die Möglichkeit, deutlich mehr Festplattenplatz bei gleicher Redundanz zu nutzen. Dies wird jedoch durch eine sehr schlechte Performance erkauft (ein raidz-Pool ist in der Regel nicht schneller als die langsamste seiner Festplatten).

Da aktuelle Festplatten mit 4kByte großen Sektoren arbeiten, sollten Pools mit der Option „-o ashift=12“ angelegt werden. Für Nicht-Test-Systeme sollte beim Anlagen immer die Festplatten-ID (aus /dev/disk/by-id/*) verwendet werden. Im Beispiel verwende ich zur Veranschaulichung die einfachen Device-Bezeichnungen wie „sda“.

Beispiel eines Pools aus 2 Festplatten:

zpool create -o ashift=12 pool1 mirror /dev/sda /dev/sdb

Beispiel eines Pools aus 4 Festplatten:

zpool create -o ashift=12 pool1 mirror /dev/sda /dev/sdb mirror /dev/sdc /dev/sdd

 

ZIL (ZFS Intent Log) hinzufügen – Schreibgeschwindigkeit erhöhen

Um verteilte Schreibzugriffe zu beschleunigen, verwendet ZFS ein sogenanntes „Intent Log“. Dies ist ein Speicherbereich, in dem Schreibzugriffe zunächst einfach gespeichert werden, um sie dann auf die eigentlichen Daten-Bereiche zu verteilen. Die verteilte Schreibgeschwindigkeit hängt maßgeblich von der Geschwindigkeit des ZIL ab. Jeder Pool hat ein „eingebautes“ ZIL auf seinen physikalischen Devices. Viel schneller wird das Dateisystem jedoch, wenn ein externes ZIL auf ein oder mehreren Solid State Disks (SSDs) verwendet wird.

Man sollte sich immer bewusst sein, dass an das ZIL die ähnliche Anforderungen an die Datensicherheit wie an den eigentlichen Pool besteht. Das bedeutet, dass man (wenn möglich) zwei SSDs als Mirror für das ZIL verwenden sollte. Die Größe des ZIL kann moderat ausfallen (5-20 Gigabyte), da die Daten dort ja nur kurz verweilen und schnell auf die Festplatten geschrieben werden. Daher ist es sinnvoll, die SSDs zu partitionieren.

Anschließend können die Partitionen dem Pool als ZIL hinzu gefügt werden:

zpool add pool1 log mirror /dev/sde1 /dev/sdf1

 

Cache hinzufügen – Lesegeschwindigkeit erhöhen

ZFS ist in der Lage, häufig verwendete Daten zu zwischenzuspeichern (zu cachen). Dabei stehen ein Hauptspeicher-Cache sowie ein Festplatten-Cache zur Verfügung. Wenn auf den SSDs noch Platz ist, kann dieser als Cache verwendet werden.

An die Datensicherheit sind hier keine großen Anforderungen zu stellen, da ja alle Daten im Pool vorliegen. Der Cache kann jederzeit verloren gehen, ohne dass dies Auswirkungen auf die Daten hat. Daher können beide SSDs als Stripe verwendet werden, was die Lesegeschwindigkeit in einigen Szenarien verdoppelt:

zpool add pool1 cache /dev/sde2 /dev/sdf2

Aufräumen und Standardwerte setzen

Der Pool enthält jetzt ein ZFS-Dateisystem, welches nach /pool1 gemountet ist. Dies kann noch entfernt werden:

zfs set mountpoint=none pool1
rm -f /pool1

Nun können noch ein paar Standardwerte für das Dateissystem gesetzt werden. Diese werden automatisch nach unten vererbt. „Compression“ sollte immer an sein. Die Kompression benötigt kaum CPU-Zeit, erhöht aber im besten Fall die IO-Performance, da weniger Daten von/zur Festplatte müssen. Atime kann ausgeschaltet werden, da sonst jeder Lesevorgang auch einen (Metadaten-)Schreibvorgang auslöst.

zfs set compression=on pool1
zfs set atime=off pool1

 

Fazit

ZFS erlaubt es, unter Verwendung von regulären SATA-Festplatten sowie zwei preiswerten (kleinen) SSDs, ein mehrere Terabyte großes Dateisystem zu erzeugen, welches in vielen Anwendungsfällen die Performance von SSDs hat.